
/*
 * EcommUtil.java
 *
 * Created on 2006年10月26日, 下午2:18
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.ecomm.util;

import java.util.Date;
import java.util.Calendar;
import java.util.Locale;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.sql.*;
import java.util.TimeZone;

/**
 * 操作日期的工具类
 * <p>
 * Title: 集团大客户售后服务管理系统
 * </p>
 * <p>
 * Description: 集团大客户售后服务管理系统，包括故障工单处理和资料维护
 * </p>
 * <p>
 * Copyright: Copyright (c) 2005
 * </p>
 * <p>
 * Company: chin@sys
 * </p>
 * 
 * @author <font color='blue'>ppLiang</font> &nbsp&nbsp<a
 *         href="mailto:pijunliang@hotmail.com">pijunliang@hotmail.com</a>
 * @version 2.0
 */
public class DateUtils {

	/**
	 * 当前时间的毫秒数
	 */
	static long now = System.currentTimeMillis();

	/**
	 * 当前日期
	 */
	public static java.util.Date CurrTime = new java.util.Date(now);

	/**
	 * 日期
	 */
	private static Date date = new Date();

	/**
	 * 构造函数
	 */
	public DateUtils() {
	}

	public static long getNow() {
		CurrTime = new java.util.Date();
		return CurrTime.getTime();
	}

	/**
	 * 通过字符串HH:mm:ss得到毫秒值
	 * 
	 * @param s
	 *            String 格式为HH:mm:ss的字符串
	 * @return long 转换后的毫秒值
	 */
	public static long getTimebyString(String s) {
		int i = s.indexOf(":");
		int j = s.lastIndexOf(":");
		long time = 0;
		if ((i != -1) && (j != -1)) {
			int hh = Integer.parseInt(s.substring(0, i));
			int mm = Integer.parseInt(s.substring(i + 1, j));
			int ss = Integer.parseInt(s.substring(j + 1, s.length()));
			time = hh * 60 * 60 * 1000 + mm * 60 * 1000 + ss * 1000;
		}
		return time;
	}

	/**
	 * 格式化日期
	 * 
	 * @param date
	 *            Date 日期
	 * @param string
	 *            String 格式字符串
	 * @return String 格式化后日期
	 */
	public static String FormatDate(Date date, String string) {
		SimpleDateFormat dateformat = new SimpleDateFormat(string);
		return dateformat.format(date);
	}

	/**
	 * 取得当前时间格式yyyy-MM-dd HH:mm:ss
	 * 
	 * @return String
	 */
	public static String getCurrTime() {
		java.util.Date date_time = new Date();
		return FormatDate(date_time, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 取得当前时间格式yyyy-MM-dd HH:mm
	 * 
	 * @return String
	 */
	public static String getCurrShortTime() {
		Date date = new Date();
		return FormatDate(date, "yyyy-MM-dd HH:mm");
	}

	/**
	 * 取得当前时间格式yyyy-MM-dd
	 * 
	 * @return String
	 */
	public static String getCurrDate() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "yyyy-MM-dd");
	}

	public static String getYYMMDDHHMMSS() {
		return FormatDate(new java.util.Date(), "yyMMddHHmmss");
	}

	/**
	 * 取得当前年份
	 * 
	 * @return String
	 */
	public static String getCurrYear() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "yyyy");

	}

	/**
	 * 取得当前月份
	 * 
	 * @return String
	 */
	public static String getCurrMonth() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "MM");

	}

	/**
	 * 取得当前日
	 * 
	 * @return String
	 */
	public static String getCurrDay() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "dd");

	}

	/**
	 * 取得当前小时
	 * 
	 * @return String
	 */
	public static String getCurrHours() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "HH");
	}

	/**
	 * 取得当前分钟
	 * 
	 * @return String
	 */
	public static String getCurrMinutes() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "mm");
	}

	/**
	 * 取得当前秒
	 * 
	 * @return String
	 */
	public static String getCurrSeconds() {
		CurrTime = new java.util.Date();
		return FormatDate(CurrTime, "ss");
	}

	/**
	 * 转换日期格式yyyy-MM-dd HH:mm:ss
	 * 
	 * @param date
	 *            Date 日期
	 * @return String
	 */
	public static String dayToString(Date date) {
		return FormatDate(date, "yyyy-MM-dd");
	}

	/**
	 * 转换日期格式yyyy-MM-dd HH:mm:ss
	 * 
	 * @param date
	 *            Date 日期
	 * @return String
	 */
	public static String dateToString(Date date) {
		return FormatDate(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 转换日期格式yyyy-MM-dd HH:mm:ss
	 * 
	 * @param date
	 *            Date 日期
	 * @return String
	 */
	public static String dateToString(java.sql.Date date) {
		return FormatDate(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 转换日期格式yyyy-MM-dd HH
	 * 
	 * @param date
	 *            Date 日期
	 * @return String
	 */
	public static String dateToString1(java.sql.Date date) {
		return FormatDate(date, "yyyy-MM-dd");
	}

	/**
	 * 转换日期格式yyyy-MM-dd HH:mm
	 * 
	 * @param date
	 *            Date 日期
	 * @return String
	 */
	public static String dateToShortString(Date date) {
		return FormatDate(date, "yyyy-MM-dd HH:mm");
	}

	/**
	 * 说明：由时间格式的字符串获得年数
	 * 
	 * @param dateString
	 *            时间格式字符串
	 * @return
	 */
	public static int getYearByString(String dateString) {
		int year = 0;
		int i = dateString.indexOf("-");
		int j = dateString.lastIndexOf("-");
		if (i != -1 && j != -1) {
			year = Integer.parseInt(dateString.substring(0, i));
		}
		return year;
	}

	/**
	 * 说明：由时间格式的字符串获得月份数
	 * 
	 * @param dateString
	 *            时间格式字符串
	 * @return
	 */
	public static int getMonthByString(String dateString) {
		int month = 1;
		int i = dateString.indexOf("-");
		int j = dateString.lastIndexOf("-");
		if (i != -1 && j != -1) {
			month = Integer.parseInt(dateString.substring(i + 1, j));
		}
		return month;
	}

	/**
	 * 说明: 字符串转换为日期 (默认格式 yyyy-MM-dd)
	 * 
	 * @param dateString
	 *            日期格式字符串
	 * @return 转换后的日期
	 */
	public static Date stringToDate(String dateString) {
		String sf = "yyyy-MM-dd";
		Date dt = stringToDate(dateString, sf);
		return dt;
	}

	/**
	 * 说明：字符串转换为时间（默认格式 yyyy-MM-dd HH:mm:ss)
	 * 
	 * @param dateString
	 *            日期格式字符串
	 * @return 转换后的日期
	 */
	public static Date StringToTime(String dateString) {
		String sf = "yyyy-MM-dd HH:mm:ss";
		Date dt = stringToDate(dateString, sf);
		return dt;
	}

	/**
	 * 说明：时间字符串格式转换（默认格式 yyyyMMddHHmmss)，主要为接口部分所用
	 * 
	 * @param dateString
	 *            日期格式字符串 （默认格式 yyyyMMddHHmmss)
	 * @return 转换后的日期格式字符串（yyyy-MM-dd HH:mm:ss） add by zhangjie
	 */
	public static String timeStringChange(String dateString) {
		String sf = "yyyyMMddHHmmss";
		Date dt = stringToDate(dateString, sf);
		String sc = dateToString(dt);
		return sc;
	}

	/**
	 * 获得当前日期的年月，形成格式为YYMM的字符串
	 * 
	 * @return String 年月字符串，格式YYMM
	 */
	public static String getPublicDate() {
		Calendar c = Calendar.getInstance();
		int month = c.get(Calendar.MONTH) + 1;
		String pd = ("" + c.get(Calendar.YEAR)).substring(2, 4)
				+ (month > 9 ? "" + month : "0" + month);
		return pd;
	}

	/**
	 * 根据参数计算并给出当前日期返回制定月所在的年
	 * 
	 * @param getback
	 *            int 返回制定月所在的年
	 * @return int
	 */
	public static int backyear(int getback) {
		int back_year = 0;
		CurrTime = new java.util.Date();
		int nowyear = Integer.parseInt(FormatDate(CurrTime, "yyyy"));
		int nowmonth = Integer.parseInt(FormatDate(CurrTime, "MM"));
		if (nowmonth > getback) {
			back_year = nowyear;
		} else {
			back_year = nowyear - 1;
		}
		return back_year;
	}

	/**
	 * 根据参数计算并给出当前日期返回制定月所在的年
	 * 
	 * @param getback
	 *            int 返回制定月所在的年
	 * @return int
	 */
	public static int backmonth(int getback) {
		int back_month = 0;
		CurrTime = new java.util.Date();
		int nowyear = Integer.parseInt(FormatDate(CurrTime, "yyyy"));
		int nowmonth = Integer.parseInt(FormatDate(CurrTime, "MM"));
		if (nowmonth > getback) {
			back_month = nowmonth - getback;
		} else {
			back_month = nowmonth - getback + 12;
		}
		return back_month;
	}

	/**
	 * 根据参数计算并给出所需的年
	 * 
	 * @param date
	 *            Date 日期
	 * @param getback
	 *            int 返回制定月所在的年
	 * @return String
	 */
	public static String dateToyear(Date date, int getback) {
		String dateyear = FormatDate(date, "yyyy");
		String datemonth = FormatDate(date, "MM");
		String newyear = "";
		int oldyear = Integer.parseInt(dateyear);
		int oldmonth = Integer.parseInt(datemonth);
		if (oldmonth > getback) {
			newyear = String.valueOf(oldyear);
		} else {
			newyear = String.valueOf(oldyear - 1);
		}
		return newyear;
	}

	/**
	 * 根据参数计算并给出所需的月
	 * 
	 * @param date
	 *            Date 日期
	 * @param getback
	 *            int 返回制定月所在的年
	 * @return String
	 */
	public static String dateTomonth(Date date, int getback) {
		String dateyear = FormatDate(date, "yyyy");
		String datemonth = FormatDate(date, "MM");
		String newmonth = "";
		int oldmonth = Integer.parseInt(datemonth);
		if (oldmonth > getback) {
			newmonth = String.valueOf(oldmonth - getback);
		} else {
			newmonth = String.valueOf(oldmonth + 12 - getback);
		}
		return newmonth;
	}

	/**
	 * 根据给定的两个时间计算时间差
	 * 
	 * @param date_1
	 *            Date 日期
	 * @param date_2
	 *            Date 日期
	 * @return int
	 */
	public static int subtime(Date date_1, Date date_2) {
		String dateyear_1 = FormatDate(date_1, "yyyy");
		String datemonth_1 = FormatDate(date_1, "MM");
		String dateyear_2 = FormatDate(date_2, "yyyy");
		String datemonth_2 = FormatDate(date_2, "MM");
		int year_1 = Integer.parseInt(dateyear_1);
		int year_2 = Integer.parseInt(dateyear_2);
		int month_1 = Integer.parseInt(datemonth_1);
		int month_2 = Integer.parseInt(datemonth_2);
		int subtime = (year_2 - year_1) * 12 + (month_2 - month_1) + 1;
		return subtime;
	}

	/**
	 * 根据给定的两个时间字符串计算时间差
	 * 
	 * @param dateString1
	 *            String 时间
	 * @param dateString2
	 *            String 时间
	 * @return long 时间差以秒为单位(dateString2-dateString1)
	 */
	public static long subsecond(String dateString1, String dateString2) {
		Date date_1 = StringToTime(dateString1);
		Date date_2 = StringToTime(dateString2);
		long subsecond = (date_2.getTime() - date_1.getTime()) / 1000;
		return subsecond;
	}

	/**
	 * 将一个表示秒数的字符串转换为n小时n分钟n秒的字符串
	 * 
	 * @param dateString
	 *            String 日期字符串
	 * @return String
	 */
	public static String changeFormat(String dateString) {
		int date = Integer.parseInt(dateString);
		int hh = 0;
		int mm = 0;
		int ss = 0;
		hh = date / 3600;
		mm = date % 3600 / 60;
		ss = date % 3600 % 60;
		String changedtime = hh + "小时";
		if (mm != 0) {
			changedtime += (hh + "分钟");
		}
		if (ss != 0) {
			if (mm == 0) {
				changedtime += "0分钟";
			}
			changedtime += (ss + "秒");
		}
		return changedtime;
	}

	/**
	 * 将一个表示秒数的字符串转换为天数
	 * 
	 * @param timelength
	 *            long 秒数
	 * @return long
	 */
	public static long changeSecondToDay(long timelength) {
		long day = 0;
		if (timelength % (24 * 3600) == 0) {
			day = timelength / 24 / 3600;
		} else {
			day = timelength / 24 / 3600 + 1;
		}
		return day;
	}

	/**
	 * 将一个表示秒数的字符串转换为分钟
	 * 
	 * @param timelengthString
	 *            String 秒数的字符串
	 * @return String
	 */
	public static String changeSecondToMinute(String timelengthString) {
		long minute = 0;
		String minuteString = "";
		long timelength = Long.parseLong(timelengthString);
		if (timelength % 60 == 0) {
			minute = timelength / 60;
		} else {
			minute = timelength / 60 + 1;
		}
		minuteString = Long.toString(minute) + "分";
		return minuteString;
	}

	/**
	 * 改变日到分
	 * 
	 * @param dayString
	 *            String 日字符串
	 * @return String
	 */
	public static String changeDayToMinute(String dayString) {
		long minute = 0;
		long day = Long.parseLong(dayString);
		String minuteString = "";
		minute = day * 24 * 60;
		minuteString = Long.toString(minute) + "分";
		return minuteString;
	}

	/**
	 * 改变分到小时
	 * 
	 * @param minuteString
	 *            String 分字符串
	 * @return String
	 */
	public static String changeMinuteToHour(String minuteString) {
		long minute = Long.parseLong(minuteString);
		long hour = 0;
		String hourString = "";
		if (minute % 60 == 0) {
			hour = minute / 60;
			hourString = Long.toString(hour) + "小时";
		} else {
			hour = minute;
			hourString = Long.toString(hour) + "分钟";
		}
		return hourString;
	}

	/**
	 * 字符串转换为日期
	 * 
	 * @param dateString
	 *            String 日期格式字符串
	 * @param sf
	 *            String 日期格式化定义
	 * @return Date 转换后的日期
	 */
	public static Date stringToDate(String dateString, String sf) {
		ParsePosition pos = new ParsePosition(0);
		SimpleDateFormat sdf = new SimpleDateFormat(sf);
		Date dt = sdf.parse(dateString, pos);
		return dt;
	}

	/**
	 * 取得月份字符串
	 * 
	 * @return String
	 */
	public static String getMonthStr() {
		java.util.Date date = new java.util.Date();
		return (date.getYear() + 1900) + "" + ("" + date.getMonth());
	}

	/**
	 * 将从oracle中取出的Date类型字符串（YYYY－MM－DD HH24：MI：SS.ms）转化为YYYY-MM-DD HH24:MI:SS
	 * 
	 * @param date
	 *            String 日期
	 * @return String
	 */
	public static String changeOracleDate(String date) {
		if (date.indexOf(".") != -1) {
			return date.substring(0, date.indexOf("."));
		} else {
			return date;
		}
	}

	/**
	 * Modify by ppLiang 当前时间 挂起开始时间 结束时间 标志 06-06-09 11；00 06-06-09 12；00
	 * 06-06-09 13；00 0 挂起开始时间 > 当前时间 06-06-09 12；00 06-06-09 11；00 06-06-09
	 * 13；00 1 挂起开始时间 < 当前时间 06-06-09 13；00 06-06-09 11；00 06-06-09 12；00 2
	 * 挂起结束时间 < 当前时间
	 * 
	 */
	public static String getBeginTimeEqualsEndTimeFlag(String beginTime,
			String endTime) {
		// 1.如果“挂起开始时间”<“当前时间“，并且小于“挂起结束时间”，挂起标志位为"1"
		// 2.如果“挂起结束时间”大于“当前时间”，挂起标志位为"2"
		// 3.如果“挂起开始时间”大于“当前时间”，挂起标志位为"0"

		Date currentDate = new Date();
		Date hangBeginTime = stringToDate(beginTime);
		Date hangEndTime = stringToDate(endTime);
		String flag = "";

		if (hangBeginTime.before(hangEndTime)) { // 挂起开始时间 < 挂起结束时间
			if ((hangBeginTime.before(currentDate))
					&& (currentDate.before(hangEndTime))) {
				// 挂起开始时间 < 当前时间 && 挂起开始时间 < 挂起结束时间
				flag = "1";
			} else if (hangEndTime.before(currentDate)) { // 挂起结束时间 < 当前时间
				flag = "2";
			} else if (currentDate.before(hangBeginTime)) { // 挂起开始时间 > 当前时间
				flag = "0";
			}
		}
		return flag;
	}

	public static String getCurrTimes() {
		java.util.Date date_time = new Date();
		return FormatDate(date_time, "HH:mm:ss");
	}

	/**
	 * 根据传近来的时间和时间格式得到对应的星期
	 * 
	 * @param TempDate
	 *            时间
	 * @param format
	 *            "yyyy-MM-dd"
	 * @return int 1~7代表星期日到星期六
	 */
	public static int GetWeekDay(String TempDate, String format) {
		int temp = 0;
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Calendar c = Calendar.getInstance();
		try {
			c.setTime(sdf.parse(TempDate));
			temp = c.get(Calendar.DAY_OF_WEEK);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return temp;
	}

	/**
	 * 传一个时间段得到这个时间段中有多少个周末
	 * 
	 * @param beginDay
	 *            int 2007-01-01
	 * @param endDay
	 *            int 2007-01-31
	 * @return int 1－31的一天
	 */
	public static int getWeekDays(String beginDay, String endDay) {
		int k = 0;
		Calendar calBegin = Calendar.getInstance();
		calBegin.setTimeZone(TimeZone.getDefault());
		calBegin.clear();
		calBegin.setTime(stringToDate(beginDay));// 开始时间

		Calendar calEnd = Calendar.getInstance();
		calEnd.setTimeZone(TimeZone.getDefault());
		calEnd.clear();
		calEnd.setTime(stringToDate(endDay));// 结束时间

		while (calBegin.before(calEnd)) {
			// 星期天 是 1 ，星期6 为 7
			if (calBegin.get(calBegin.DAY_OF_WEEK) == 1
					|| calBegin.get(calBegin.DAY_OF_WEEK) == 7) {
				++k; // 有就给K加1
			}
			calBegin.roll(calBegin.DATE, true); // 当前日期向前动1天递增
			// System.out.println(calBegin.getTime());
			if (calBegin.after(calEnd)) { // 开始时间大于结束时间 就结束循环
				break;
			}
		}
		if (GetWeekDay(endDay, "yyyy-MM-dd") == 1
				|| GetWeekDay(endDay, "yyyy-MM-dd") == 7) {
			k += 1;
		}
		return k;
	}

	/**
	 * 计算星期几的函数
	 * 
	 * @param year
	 *            int
	 * @param month
	 *            int
	 * @param date
	 *            int
	 * @return int 1~7代表星期日到星期六
	 */
	public static int getDayOfWeek(int year, int month, int date) {
		Calendar cal = Calendar.getInstance();
		cal.setTimeZone(TimeZone.getDefault());
		cal.clear();
		cal.set(year, month - 1, date);
		return cal.get(cal.DAY_OF_WEEK);
	}

	/**
	 * 根据传进来的参数得到当前月最后一天
	 */
	public static int getLastDayOfMonth(String time, String format) {
		Calendar cDay1 = Calendar.getInstance();
		cDay1.setTime(stringToDate(time, format));
		int lastDay = cDay1.getActualMaximum(Calendar.DAY_OF_MONTH);
		return lastDay;
	}

	/**
	 * 版本投产通知,获得投产时间
	 * 
	 * @return
	 */
	public static String getTimeOfInform() {
		String time = null;
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(CurrTime);
		int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int week = calendar.get(Calendar.DAY_OF_WEEK);
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;
		if ((week - 7) == 0) {
			if ((day + 4) - lastDay > 0) {
				month += 1;
				day = (day + 4) - lastDay;
			} else {
				day = (day + 4);
			}
		} else if ((week - 4) >= 0) {
			if ((day + 7 - week) - lastDay > 0) {
				month += 1;
				day = (day + 7 - week) - lastDay;
			} else {
				day = (day + 7 - week);
			}
		} else {
			if ((day + 4 - week) - lastDay > 0) {
				month += 1;
				day = (day + 4 - week) - lastDay;
			} else {
				day = (day + 4 - week);
			}
		}
		String m = null;
		String d = null;
		if (month <= 9) {
			m = "0" + month;
		} else {
			m = (new Integer(month)).toString();
		}
		if (day <= 9) {
			d = "0" + day;
		} else {
			d = (new Integer(day)).toString();
		}
		time = year + "-" + m + "-" + d + " 22:00:00";
		// SimpleDateFormat dateformat = new
		// SimpleDateFormat("yyyy-MM-dd-EEE",Locale.ENGLISH);
		// time=dateformat.format(CurrTime);
		return time;
	}

	public static void main(String[] args) {
		// String dateStr = "2-17--2-25";
		// System.out.println(getWeekDays("2007-02-03","2007-02-25"));
		// System.out.println(getLastDayOfMonth("2008-2" ,"yyyy-MM"));
		// System.out.println(GetWeekDay("2007-04-29" ,"yyyy-MM-dd"));
		System.out.println(CurrTime);
		System.out.println(getTimeOfInform());
		// System.out.println(dateStr.substring(0,dateStr.indexOf("--")));
		// System.out.println(dateStr.substring(dateStr.indexOf("--")+2));
		// System.out.println(getWeekDays("2007-09-08","2007-09-23"));
		// System.out.println(1000*60*60*24);
		// System.out.println(DateUtils.stringToDate(DateUtils.getCurrDate()));
		// System.out.println(DateUtils.stringToDate(dateStr).before(DateUtils.stringToDate(DateUtils.getCurrDate())));
		// System.out.println(timeStringChange(dateStr));
		// System.out.println(getPublicDate());
	}
}
